<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        /*
                                                    测试题1:  先执行变量提升, 再执行函数提升
                                                        */
        function a() {}
        var a
        console.log(typeof a) // 'function'

        /*
        测试题2:
           1.首先，所有的全局变量都是window的属性，语句var b = 1; 等价于window.b = 1;
           可以使用 console.log(b in window); 来检测全局变量是否声明。
           2.第二，所有的变量声明都在范围作用域的顶部：
           console.log(b in window) 
           var b;
           此时，尽管声明是在console.log() 之后，log 打印的依然是true,这是因为js引擎
           首先会扫描所有的变量声明，然后将这些变量声明移动到顶部，最终的代码效果是这样的:
           
           var b;
           console.log(b in window)
           这样看起来就很容易理解为什么log结果是true了。
           3. 第三，你需要理解题目的意思是，变量声明被提前了，
            但变量赋值没有，因为这行代码包括了变量声明和变量赋值。

            你可以将语句拆分为如下代码:

            var b;  // 声明 
            b = 1;  // 初始化赋值
            当变量声明和赋值在一起的时候，js引擎会自动将它分为两部以便将变量声明提前，
             不将赋值的步骤提前是因为他有可能影响，代码执行出不可预期的结果。

            
        */
        console.log(b in window); // true
        if (!(b in window)) {
            var b = 1
        }
        console.log(b) // undefined(说明b在window中，但是没有赋值)--变量提升

        /*
        测试题3:
        */
        var c = 1

        function c(c) {
            console.log(c)
            var c = 3 //与此行无关
        }
        console.log(c);
        c(2) // 报错  c is not a function
    </script>
</body>

</html>